<?php
namespace app\admin\controller;
use app\admin\model\Page as pg;
use think\Config;
use think\Db;
class Page extends Authentication
{
    //==============
    //1.页面清单列表
    //==============
    public function index()
    {
      try{
        //加载模块配置:默认分页条数
        define("PAGINATE_NUM",config('DEFAULT_PAGINATE_NUM'));

       
        //page表查询排序分页输出
        $pages = Db::name('page')->alias('p')->field('p.id,p.title,p.thumbnail,p.author,p.status,p.parent_id,p.order,p.create_time,p.update_time')->paginate(PAGINATE_NUM);

        //模板参数赋值
        $this->assign('PAGES',$pages);
        
        return $this->fetch();
      }
      catch(\Exception $e){ //异常捕捉
        $msg = $e->getMessage();
        return $this->error('错误提示:页面列表错误'.$msg,url('Page/index'));
      }
    }
    //========
    //添加方法
    //========
    public function insert()
    {
        //加载模块配置参数:文件默认上传路径
        define("UPLOAD_PATH",config('DEFAULT_IMG_UPLOAD_PATH'));
        
        //----------------------------------------
        //以下新增页面页面请求处理信息(插入数据库)
        //----------------------------------------
        
        //判断表单是否Post传值
        if(request()->isPost()){
          
          $data=[          
            //默认页面字段
            "title"     =>input("title"),
            "keywords"  =>input("keywords"),
            "desc"      =>input("desc"),
            "thumbnail" =>input("thumbnail"),
            "content"   =>input("content"),
            "status"    =>input("status"),
            "parent_id"  =>input("parent_id"),
            "order"    =>input("order"),
            "creator"   =>session('user_name'),
            "create_time"=>date("Y-m-d H:i:s",time()),
          ];
          /**
           * 以下:缩略图上传处理
           */
          //判断暂存在服务器上的上传文件临时副本的名称是否存在
          if($_FILES['thumbnail']['tmp_name']){
            
            //获取表单上传文件
            $file = request()->file('thumbnail');

            //移动到框架应用根目录/public/static/uploads/image目录下,并按日期存储
            $info = $file->move(ROOT_PATH . 'public' . DS . UPLOAD_PATH);
            if($info){
                //成功上传后 获取上传信息
                $data['thumbnail'] = UPLOAD_PATH . date('Y-m-d') . '/' . $info->getFilename();
            }else{
                //上传失败获取错误信息
                return $this->error($file->getError());
            }
          }else{
                //上传失败获取错误信息，抛出异常
                //return $this->error($file->getError());
          }
          
          //按照规则实例化页面字段验证器
          $validate = \think\Loader::validate('Page');
          
          //验证待插入数据
          if($validate->check($data)){
            
            //插入数据            
            $res = Db::name('Page')->insert($data);
            
            //判断插入结果            
            if($res){
              return $this->success("页面添加成功!",url('Page/index'));
            }else{
              return $this->error("页面添加失败!",url('Page/index'));
            }    
          }else{
            return $this->error($validate->getError());
          }
        }
        
        //--------------------------------------------
        //以下获取页面分类信息并给新增页面模板参数赋值
        //--------------------------------------------
        //实例化模型层对象
        $p_menu = new pg;
        
        //查询顶级以下所有页面分类
        $menu = $p_menu->displayPage(0,0,true);
        
        //模板参数变量替换
        $this->assign('PAGE_MENU',$menu);
        
        //如果是添加页面普通加载
        return $this->fetch('insert');

    }
    
    //==============
    //删除方法(单个)
    //==============
    public function delete()
    {
        //判断表单是否Get传值
        if(request()->isGet()){
          $id = input('id');
          
          // 通过助手函数根据主键删除
          if(Db::name('page')->delete($id)){
            //return $this->success("页面删除成功!",url('Page/index'));
            show(1, "页面删除成功!");
          }else{
            //return $this->error("页面删除失败!",url('Page/index'));
            show(1, "页面删除失败!");
          }
        }
    }
    //==============
    //删除方法(批量)
    //==============
    public function batch_delete()
    {
        //判断表单是否Post传值
        if(request()->isPost()){
          
          //获取参数
          $id =\think\Request::instance()->param('id'); 
          
          //判断参数是否为空
          if(empty($id)){
            return $this->error("未选择内容");
          }
          
          //非空处理
          $id = join(",",$id);
          
          // 通过助手函数根据主键删除
          if(Db::name('Page')->delete($id)){
            return $this->success("页面批量删除成功!",url('Page/index'));
          }else{
             return $this->error("页面批量删除失败!",url('Page/index'));
          }
        }
    }
    //编辑方法
    public function edit()
    {
        //加载模块配置文件:默认文件上传路径参数
        define("UPLOAD_PATH",config('DEFAULT_IMG_UPLOAD_PATH'));
        
        //====================================
        //以下处理表单中用户提交的页面更新信息
        //====================================
        
        //判断表单是否Post传值
        if(request()->isPost()){
          
          //待编辑文档ID类型转换
          $id = (int)input('id');
          $parent_id = (int)input('parent_id');
          
          //获取页面更新数据
          $data = [
            'title'=>input('title'),
            'keywords'=>input('keywords'),
            'desc'=>input('desc'),
            'content'=>input('content'),
            'parent_id'=>$parent_id,
            'status'=>input('status'),
            'creator'=>session('user_name'),
            'update_time'=>date("Y-m-d H:i:s",time()),
          ];
          
          //实例化模型层对象,获取子页面ID数组
          $p = new pg;
          $sub_id = $p->getSubID($id);
          
          if(input('id')==input('parent_id')){
            
            //判断用户设置的父级页面是否是自身ID
            return $this->error("父ID不应是自身ID!",url('Page/index'));
            
          }else if(in_array($parent_id, $sub_id)){
            
            //不允许定义页面的父ID为子级页面ID
            return $this->error("父ID不应是子级页面ID!",url('Page/index'));
          }
          
          //判断暂存在服务器上的文件的临时副本的名称
          if($_FILES['thumbnail']['tmp_name']){
            
            //获取表单上传文件
            $file = request()->file('thumbnail');

            //移动到框架应用根目录/public/static/uploads/image目录下,并按日期存储
            $info = $file->move(ROOT_PATH . 'public' . DS . UPLOAD_PATH);
            
            if($info){
              
                //成功上传后 获取上传信息
                $data['thumbnail'] = UPLOAD_PATH . date('Y-m-d') . '/' . $info->getFilename();
            }else{
                //上传失败获取错误信息
                return $this->error($file->getError());
            }
          }
          //是否删除缩略图
          if ('1'==input('delete_thumbnail')){
            $data['thumbnail'] = NULL;
          }
          //按照规则实例化验证器
          $validate = \think\Loader::validate('Page');

          //验证器以编辑场景验证待更新数据
          if($validate->scene('edit')->check($data)){

            //更新数据表的数据
            $res = Db::name('Page')
                    ->where('id', $id)
                    ->update($data);
            
            // 判断更新结果        
            if($res){
              return $this->success("页面更新成功!",url('Page/index'));
            }else{
               return $this->error("页面更新失败!",url('Page/index'));
            }
          }else{
            return $this->error($validate->getError());
          }
        }

        //====================================
        //以下加载页面编辑页面
        //====================================
        //判断表单是否Get传值
        if(request()->isGet()){
          
          //获取页面ID
          $id = (int)input('id');
          
          //查询页面
          $Page = Db::name('Page')->where('id',$id)->find();
          $this->assign('PAGE',$Page);
          
          //--------------------------------------------
          //以下获取页面分类信息并给新增页面模板参数赋值
          //--------------------------------------------
          //实例化模型层对象
          $p_menu = new pg;

          //查询顶级以下所有页面分类,并且选中当前
          $menu = $p_menu->displayPage(0,$Page["parent_id"],true,$id);
          
          //模板参数变量替换
          $this->assign('PAGE_MENU',$menu);
          var_export($menu);          
          //更新页面加载
          return $this->fetch('edit');          
        }
    }
}    